{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.array([[0.9526, -0.246, -0.8856],\n",
    "                [0.5639, 0.2379, 0.9104]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.9526, -0.246 , -0.8856],\n",
       "       [ 0.5639,  0.2379,  0.9104]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 9.526, -2.46 , -8.856],\n",
       "       [ 5.639,  2.379,  9.104]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data * 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.9052, -0.492 , -1.7712],\n",
       "       [ 1.1278,  0.4758,  1.8208]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data + data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 3)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "data1 = [6, 7.5, 8, 0, 1]\n",
    "arr1 = np.array(data1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([6. , 7.5, 8. , 0. , 1. ])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "data2 = [[1,2,3,4],[5,6,7,8]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2=np.array(data2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3, 4],\n",
       "       [5, 6, 7, 8]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.ndim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 4)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('int32')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((3,6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0., 0.],\n",
       "        [0., 0.],\n",
       "        [0., 0.]],\n",
       "\n",
       "       [[0., 0.],\n",
       "        [0., 0.],\n",
       "        [0., 0.]]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.empty((2,3,2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., 0.],\n",
       "       [0., 1., 0., 0.],\n",
       "       [0., 0., 1., 0.],\n",
       "       [0., 0., 0., 1.]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.eye(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 1.]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.identity(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr1 = np.array([1,2,3],dtype=float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2 = np.array([1,2,3],dtype=np.int32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr1.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('int32')"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.array([1,2,3,4,5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('int32')"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "float_arr = arr.astype(np.float64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('float64')"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "float_arr.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.array([3.7, -1.2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3.7, -1.2])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3, -1])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.astype(np.int32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "numeric_strings = arr.astype(np.string_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([b'3.7', b'-1.2'], dtype='|S32')"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numeric_strings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3.7, -1.2])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numeric_strings.astype(float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 3.7, -1.2])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([13.69,  1.44])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr * arr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 基本的索引和切片 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5, 6, 7])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[5:8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr[5:8] = 12"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 数组切片是原始数组的视图. 这意味着数据不会被复制"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr_slice = arr[5:8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([12, 12, 12])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr_slice"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr_slice[1] = 12345"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   12, 12345,    12])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr_slice"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,\n",
       "           9])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr_slice[:] = 64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 8, 9])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[0][2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[0, 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 1,  2,  3],\n",
       "        [ 4,  5,  6]],\n",
       "\n",
       "       [[ 7,  8,  9],\n",
       "        [10, 11, 12]]])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr3d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6],\n",
       "       [7, 8, 9]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 3],\n",
       "       [5, 6]])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[:2, 1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4, 5])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[1,:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[2,:1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [4],\n",
       "       [7]])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr2d[:,:1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 布尔型索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.random.randn(7,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.05265601, -0.20326875, -0.0469502 ,  0.53693258],\n",
       "       [ 0.29166095,  1.38826097,  0.28666989, -1.26604766],\n",
       "       [ 2.14563655, -0.6973371 ,  0.53310953,  1.86106793],\n",
       "       [-1.04529973, -0.26875675, -0.03667557,  0.74478672],\n",
       "       [-1.11182411,  0.73851645, -0.76399219,  0.96372603],\n",
       "       [ 0.94274745, -0.3527359 , -0.38293074,  0.74652946],\n",
       "       [-0.98305416,  0.16144601, -1.59267844,  1.07369717]])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False,  True, False, False, False])"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names == 'Bob'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.05265601, -0.20326875, -0.0469502 ,  0.53693258],\n",
       "       [-1.04529973, -0.26875675, -0.03667557,  0.74478672]])"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[names == 'Bob']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False,  True,  True, False,  True,  True,  True])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names != 'Bob'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.29166095,  1.38826097,  0.28666989, -1.26604766],\n",
       "       [ 2.14563655, -0.6973371 ,  0.53310953,  1.86106793],\n",
       "       [-1.11182411,  0.73851645, -0.76399219,  0.96372603],\n",
       "       [ 0.94274745, -0.3527359 , -0.38293074,  0.74652946],\n",
       "       [-0.98305416,  0.16144601, -1.59267844,  1.07369717]])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[~(names == 'Bob')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False,  True, False, False, False])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names == 'Bob'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "mask = (names == 'Bob') | (names == 'Will')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False,  True,  True,  True, False, False])"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mask"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.05265601, -0.20326875, -0.0469502 ,  0.53693258],\n",
       "       [ 2.14563655, -0.6973371 ,  0.53310953,  1.86106793],\n",
       "       [-1.04529973, -0.26875675, -0.03667557,  0.74478672],\n",
       "       [-1.11182411,  0.73851645, -0.76399219,  0.96372603]])"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[mask]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.20326875, -0.0469502 , -1.26604766, -0.6973371 , -1.04529973,\n",
       "       -0.26875675, -0.03667557, -1.11182411, -0.76399219, -0.3527359 ,\n",
       "       -0.38293074, -0.98305416, -1.59267844])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[data<0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "data[data<0]=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.05265601, 0.        , 0.        , 0.53693258],\n",
       "       [0.29166095, 1.38826097, 0.28666989, 0.        ],\n",
       "       [2.14563655, 0.        , 0.53310953, 1.86106793],\n",
       "       [0.        , 0.        , 0.        , 0.74478672],\n",
       "       [0.        , 0.73851645, 0.        , 0.96372603],\n",
       "       [0.94274745, 0.        , 0.        , 0.74652946],\n",
       "       [0.        , 0.16144601, 0.        , 1.07369717]])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "data[names != 'Joe']=7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7.        , 7.        , 7.        , 7.        ],\n",
       "       [0.29166095, 1.38826097, 0.28666989, 0.        ],\n",
       "       [7.        , 7.        , 7.        , 7.        ],\n",
       "       [7.        , 7.        , 7.        , 7.        ],\n",
       "       [7.        , 7.        , 7.        , 7.        ],\n",
       "       [0.94274745, 0.        , 0.        , 0.74652946],\n",
       "       [0.        , 0.16144601, 0.        , 1.07369717]])"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 花式索引 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.empty((8,4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(8):\n",
    "    arr[i]=i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0.],\n",
       "       [1., 1., 1., 1.],\n",
       "       [2., 2., 2., 2.],\n",
       "       [3., 3., 3., 3.],\n",
       "       [4., 4., 4., 4.],\n",
       "       [5., 5., 5., 5.],\n",
       "       [6., 6., 6., 6.],\n",
       "       [7., 7., 7., 7.]])"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4., 4., 4., 4.],\n",
       "       [3., 3., 3., 3.],\n",
       "       [0., 0., 0., 0.],\n",
       "       [6., 6., 6., 6.]])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[4,3,0,6]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5., 5., 5., 5.],\n",
       "       [3., 3., 3., 3.],\n",
       "       [1., 1., 1., 1.]])"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[-3,-5,-7]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(32).reshape((-1, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11],\n",
       "       [12, 13, 14, 15],\n",
       "       [16, 17, 18, 19],\n",
       "       [20, 21, 22, 23],\n",
       "       [24, 25, 26, 27],\n",
       "       [28, 29, 30, 31]])"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  5,  6,  7],\n",
       "       [20, 21, 22, 23],\n",
       "       [28, 29, 30, 31],\n",
       "       [ 8,  9, 10, 11]])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[1,5,7,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4, 23, 29, 10])"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[1,5,7,2],[0,3,1,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  7,  5,  6],\n",
       "       [20, 23, 21, 22],\n",
       "       [28, 31, 29, 30],\n",
       "       [ 8, 11,  9, 10]])"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[[1,5,7,2]][:,[0,3,1,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[1],\n",
       "        [5],\n",
       "        [7],\n",
       "        [2]]), array([[0, 3, 1, 2]]))"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ix_([1,5,7,2],[0,3,1,2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4,  7,  5,  6],\n",
       "       [20, 23, 21, 22],\n",
       "       [28, 31, 29, 30],\n",
       "       [ 8, 11,  9, 10]])"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr[np.ix_([1,5,7,2],[0,3,1,2])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11],\n",
       "       [12, 13, 14, 15],\n",
       "       [16, 17, 18, 19],\n",
       "       [20, 21, 22, 23],\n",
       "       [24, 25, 26, 27],\n",
       "       [28, 29, 30, 31]])"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  4,  8, 12, 16, 20, 24, 28],\n",
       "       [ 1,  5,  9, 13, 17, 21, 25, 29],\n",
       "       [ 2,  6, 10, 14, 18, 22, 26, 30],\n",
       "       [ 3,  7, 11, 15, 19, 23, 27, 31]])"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[12.79022146, -6.4951539 ,  1.31561041],\n",
       "       [-6.4951539 ,  4.30221855, -1.1080268 ],\n",
       "       [ 1.31561041, -1.1080268 ,  7.49967069]])"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr = np.random.randn(6,3)\n",
    "np.dot(arr.T, arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(16).reshape((2,2,4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  1,  2,  3],\n",
       "        [ 4,  5,  6,  7]],\n",
       "\n",
       "       [[ 8,  9, 10, 11],\n",
       "        [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  1,  2,  3],\n",
       "        [ 8,  9, 10, 11]],\n",
       "\n",
       "       [[ 4,  5,  6,  7],\n",
       "        [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.transpose((1,0,2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  1,  2,  3],\n",
       "        [ 4,  5,  6,  7]],\n",
       "\n",
       "       [[ 8,  9, 10, 11],\n",
       "        [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  4],\n",
       "        [ 1,  5],\n",
       "        [ 2,  6],\n",
       "        [ 3,  7]],\n",
       "\n",
       "       [[ 8, 12],\n",
       "        [ 9, 13],\n",
       "        [10, 14],\n",
       "        [11, 15]]])"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.swapaxes(1,2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "swapaxes也是源数据的视图(不会进行任何复制操作)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通用函数:快速的元素级数组函数 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,\n",
       "       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,\n",
       "       5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,\n",
       "       2.98095799e+03, 8.10308393e+03])"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.exp(arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.random.randn(8)\n",
    "y = np.random.randn(8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.9474861 , -1.81131797, -1.54931539, -2.70414604,  0.3209057 ,\n",
       "       -1.02536924,  1.3387087 ,  1.27606398])"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.31480321,  0.16141099, -1.58051486, -0.60590663, -0.35194421,\n",
       "        0.01784815,  0.738828  ,  0.71251129])"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.31480321,  0.16141099, -1.54931539, -0.60590663,  0.3209057 ,\n",
       "        0.01784815,  1.3387087 ,  1.27606398])"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.maximum(x, y) # 元素级最大值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(7)*5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-2.83291723,  2.00584401,  3.20350642,  1.15898206,  1.18254909,\n",
       "        1.60511738, 10.44532918])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([-0.83291723,  0.00584401,  0.20350642,  0.15898206,  0.18254909,\n",
       "         0.60511738,  0.44532918]), array([-2.,  2.,  3.,  1.,  1.,  1., 10.]))"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.modf(arr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 利用数组进行数据处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [],
   "source": [
    "points = np.arange(-5, 5, 0.01) #1000个间隔相等的点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs, ys = np.meshgrid(points, points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],\n",
       "       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],\n",
       "       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],\n",
       "       ...,\n",
       "       [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],\n",
       "       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],\n",
       "       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       ...,\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],\n",
       "       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99]])"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [],
   "source": [
    "z = np.sqrt(xs**2 + ys**2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,\n",
       "        7.06400028],\n",
       "       [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,\n",
       "        7.05692568],\n",
       "       [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,\n",
       "        7.04985815],\n",
       "       ...,\n",
       "       [7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,\n",
       "        7.04279774],\n",
       "       [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,\n",
       "        7.04985815],\n",
       "       [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,\n",
       "        7.05692568]])"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.colorbar.Colorbar at 0x23490a52e80>"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(z, cmap=plt.cm.gray); plt.colorbar()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Image of plot of $\\\\sqrt{x^2 + y^2}$ for a grid of values')"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(z, cmap=plt.cm.gray); plt.colorbar(); plt.title('Image of plot of $\\sqrt{x^2 + y^2}$ for a grid of values')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [],
   "source": [
    "xarr = np.array([1.1,1.2,1.3,1.4,1.5])\n",
    "yarr = xarr + 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.1, 1.2, 1.3, 1.4, 1.5])"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xarr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.1, 2.2, 2.3, 2.4, 2.5])"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "yarr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [],
   "source": [
    "cond = np.array([True, False, True, True, False])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1.1, 2.2, 1.3, 1.4, 2.5]"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = np.where(cond, xarr, yarr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.1, 2.2, 1.3, 1.4, 2.5])"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.random.randn(4,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.15024879, -2.20542071, -0.62222512, -0.83234007],\n",
       "       [-0.08381562,  0.8489062 ,  1.98231719,  0.24988736],\n",
       "       [ 0.48187862, -1.16666296, -0.95149279, -0.48254149],\n",
       "       [-0.60053262, -1.22336779, -0.03379967,  0.08340646]])"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-2, -2, -2, -2],\n",
       "       [-2,  2,  2,  2],\n",
       "       [ 2, -2, -2, -2],\n",
       "       [-2, -2, -2,  2]])"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.where(arr>0, 2, -2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.15024879, -2.20542071, -0.62222512, -0.83234007],\n",
       "       [-0.08381562,  2.        ,  2.        ,  2.        ],\n",
       "       [ 2.        , -1.16666296, -0.95149279, -0.48254149],\n",
       "       [-0.60053262, -1.22336779, -0.03379967,  2.        ]])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.where(arr>0, 2, arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.15024879, -2.20542071, -0.62222512, -0.83234007],\n",
       "       [-0.08381562,  0.8489062 ,  1.98231719,  0.24988736],\n",
       "       [ 0.48187862, -1.16666296, -0.95149279, -0.48254149],\n",
       "       [-0.60053262, -1.22336779, -0.03379967,  0.08340646]])"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.29412823705304925"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.95255867,  0.74932378, -0.52970465, -0.4435734 ])"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.mean(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.0881796 , -0.93663631,  0.0936999 , -0.24539693])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.mean(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-4.706051792848788"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.35271841, -3.74654526,  0.37479961, -0.98158774])"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sum(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-3.8102347 ,  2.99729513, -2.11881861, -1.77429362])"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sum(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.15024879, -2.3556695 , -2.97789463, -3.8102347 , -3.89405031,\n",
       "       -3.04514411, -1.06282692, -0.81293956, -0.33106094, -1.4977239 ,\n",
       "       -2.44921668, -2.93175817, -3.5322908 , -4.75565858, -4.78945825,\n",
       "       -4.70605179])"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.cumsum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.15024879, -2.20542071, -0.62222512, -0.83234007],\n",
       "       [-0.23406441, -1.35651451,  1.36009207, -0.58245271],\n",
       "       [ 0.24781422, -2.52317747,  0.40859928, -1.0649942 ],\n",
       "       [-0.35271841, -3.74654526,  0.37479961, -0.98158774]])"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.cumsum(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.15024879, -2.3556695 , -2.97789463, -3.8102347 ],\n",
       "       [-0.08381562,  0.76509058,  2.74740777,  2.99729513],\n",
       "       [ 0.48187862, -0.68478434, -1.63627712, -2.11881861],\n",
       "       [-0.60053262, -1.82390041, -1.85770008, -1.77429362]])"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.cumsum(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9320266902128439"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.std()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.argmin()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.15024879, -2.20542071, -0.62222512, -0.83234007],\n",
       "       [-0.08381562,  0.8489062 ,  1.98231719,  0.24988736],\n",
       "       [ 0.48187862, -1.16666296, -0.95149279, -0.48254149],\n",
       "       [-0.60053262, -1.22336779, -0.03379967,  0.08340646]])"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "51"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr = np.random.randn(100)\n",
    "(arr > 0).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [],
   "source": [
    "bools = np.array([True, 0, 0, 0], dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('bool')"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bools.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False, False])"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bools"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bools.any()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bools.all()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.72075708,  0.15103391,  1.01597178,  1.00580159,  1.82253342,\n",
       "        0.8478649 , -0.54915786,  0.56194487])"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr = np.random.randn(8)\n",
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.72075708, -0.54915786,  0.15103391,  0.56194487,  0.8478649 ,\n",
       "        1.00580159,  1.01597178,  1.82253342])"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sort()\n",
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.90930541, -2.38866853, -1.52973998],\n",
       "       [-1.35719395, -1.97865626, -0.46164189],\n",
       "       [ 2.14385297,  0.9206166 , -0.22604926],\n",
       "       [-0.73752831, -0.01557716,  0.84108967],\n",
       "       [ 0.42088654,  0.6687599 , -0.70396504]])"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr = np.random.randn(5,3)\n",
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-2.38866853, -1.52973998, -0.90930541],\n",
       "       [-1.97865626, -1.35719395, -0.46164189],\n",
       "       [-0.22604926,  0.9206166 ,  2.14385297],\n",
       "       [-0.73752831, -0.01557716,  0.84108967],\n",
       "       [-0.70396504,  0.42088654,  0.6687599 ]])"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sort(1)\n",
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-2.38866853, -1.52973998, -0.90930541],\n",
       "       [-1.97865626, -1.35719395, -0.46164189],\n",
       "       [-0.73752831, -0.01557716,  0.6687599 ],\n",
       "       [-0.70396504,  0.42088654,  0.84108967],\n",
       "       [-0.22604926,  0.9206166 ,  2.14385297]])"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arr.sort(0)\n",
    "arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bob', 'Joe', 'Will'], dtype='<U4')"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4])"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ints = np.array([3,3,3,2,2,2,1,1,4,4])\n",
    "np.unique(ints)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False,  True,  True, False,  True])"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "values = np.array([6, 0, 0, 3, 2, 5, 6])\n",
    "np.in1d(values, [2, 3, 6])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [],
   "source": [
    "arr = np.arange(10)\n",
    "np.save('some_array', arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.load('some_array.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.savez('some_array', a=arr,b=arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arch = np.load('some_array.npz')\n",
    "arch['a']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arch['b']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.savetxt('some_ex.txt', arr,  delimiter=',') "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 线性代数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([[1,2,3],[4.0,5,6]])\n",
    "y = np.array([[6.,23],[-1,7],[8,9]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2., 3.],\n",
       "       [4., 5., 6.]])"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6., 23.],\n",
       "       [-1.,  7.],\n",
       "       [ 8.,  9.]])"
      ]
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 28.,  64.],\n",
       "       [ 67., 181.]])"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.dot(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 6., 15.])"
      ]
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.dot(x, np.ones(3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [],
   "source": [
    "from numpy.linalg import inv, qr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.random.randn(5, 5)\n",
    "mat = X.T.dot(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 7.28917435,  1.22684403,  1.67806282, -1.91703243,  1.71191268],\n",
       "       [ 1.22684403,  1.11727682, -1.18443617, -0.543258  ,  0.10537055],\n",
       "       [ 1.67806282, -1.18443617,  6.24917655, -1.09613869,  1.64664754],\n",
       "       [-1.91703243, -0.543258  , -1.09613869,  1.09036414, -1.50728328],\n",
       "       [ 1.71191268,  0.10537055,  1.64664754, -1.50728328,  8.20838746]])"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.26884219, -0.12601399, -0.03008439,  0.41909243,  0.02854071],\n",
       "       [-0.12601399,  4.92117715,  1.63661728,  4.51751459,  0.46433239],\n",
       "       [-0.03008439,  1.63661728,  0.73919552,  1.71582842,  0.15205125],\n",
       "       [ 0.41909243,  4.51751459,  1.71582842,  6.63778644,  0.7292781 ],\n",
       "       [ 0.02854071,  0.46433239,  0.15205125,  0.7292781 ,  0.21332664]])"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv(mat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.00000000e+00,  5.00630472e-16, -2.96515776e-17,\n",
       "        -3.62740174e-16,  8.08659704e-17],\n",
       "       [-2.72679618e-17,  1.00000000e+00,  7.52155026e-17,\n",
       "         9.96752311e-17, -1.30058758e-17],\n",
       "       [ 3.46599871e-17, -9.68152490e-16,  1.00000000e+00,\n",
       "        -1.54763589e-15, -1.35009649e-16],\n",
       "       [ 1.26611205e-16, -9.73683119e-16, -2.21478916e-16,\n",
       "         1.00000000e+00, -8.42751022e-17],\n",
       "       [ 1.75518819e-17,  1.79767411e-15,  9.33080576e-17,\n",
       "         2.39417526e-15,  1.00000000e+00]])"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mat.dot(inv(mat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [],
   "source": [
    "q, r = qr(mat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.91072879, -0.08054535,  0.38414148, -0.12459404,  0.03157781],\n",
       "       [-0.15328515, -0.53596816, -0.6005164 , -0.25434144,  0.5137434 ],\n",
       "       [-0.20966162,  0.82283014, -0.42448942, -0.26551734,  0.16823148],\n",
       "       [ 0.23951912,  0.14771646,  0.51723986, -0.04704842,  0.80688278],\n",
       "       [-0.21389091,  0.08591267, -0.20996911,  0.92036609,  0.23602737]])"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-8.00367179, -1.1929118 , -3.27166528,  2.64254549, -4.03720137],\n",
       "       [ 0.        , -1.74342664,  5.6212209 , -0.42478892,  1.64310334],\n",
       "       [ 0.        ,  0.        , -2.20953421,  0.93558566, -2.60777936],\n",
       "       [ 0.        ,  0.        ,  0.        , -0.77048466,  6.94832909],\n",
       "       [ 0.        ,  0.        ,  0.        ,  0.        ,  1.10641301]])"
      ]
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 随机数生成 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.19686761, -0.16662091, -0.54925473,  0.48085475],\n",
       "       [ 1.41045368, -1.12993105, -1.03844161, -0.13025966],\n",
       "       [ 0.2639054 ,  0.2659665 ,  0.22744034,  0.73837133],\n",
       "       [-0.03148557,  0.46471611,  1.16599107, -2.1102076 ]])"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "samples = np.random.normal(size=(4,4))\n",
    "samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [],
   "source": [
    "from random import normalvariate\n",
    "N=1000000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "828 ms ± 12.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit samples=[normalvariate(0,1) for _ in range(N)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "26.1 ms ± 364 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit samples = np.random.normal(size=N)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 范例: 随机漫步"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "position=0\n",
    "walk = [position]\n",
    "steps = 1000\n",
    "for i in range(steps):\n",
    "    step = 1 if random.randint(0,1) else -1\n",
    "    position += step\n",
    "    walk.append(position)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [],
   "source": [
    "nsteps = 1000\n",
    "draws = np.random.randint(0, 2, size=nsteps)\n",
    "steps = np.where(draws>0, 1, -1)\n",
    "walk = steps.cumsum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-25"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "walk.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "13"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "walk.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
